package com.hanserwei.han_picture.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Kryo Redis 配置
 * 专门用于处理二进制数据的 RedisTemplate
 */
@Configuration
public class KryoRedisConfig {

    /**
     * 专门用于 Kryo 序列化的 RedisTemplate
     * Key 使用 String 序列化，Value 直接存储 byte[]
     */
    @Bean("kryoRedisTemplate")
    public RedisTemplate<String, byte[]> kryoRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // Key 使用 String 序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);

        // Value 直接存储为 byte[]，不进行额外序列化
        template.setValueSerializer(new ByteArrayRedisSerializer());
        template.setHashValueSerializer(new ByteArrayRedisSerializer());

        template.afterPropertiesSet();
        return template;
    }

    /**
     * 自定义的 byte[] 序列化器
     * 直接返回原始数据，不进行任何转换
     */
    public static class ByteArrayRedisSerializer implements org.springframework.data.redis.serializer.RedisSerializer<byte[]> {

        @Override
        public byte[] serialize(byte[] bytes) {
            return bytes;
        }

        @Override
        public byte[] deserialize(byte[] bytes) {
            return bytes;
        }
    }
}
